import Xlsx from 'xlsx'
import {getLodop} from './LodopFuncs';
import moment from "moment";


/**
 * 添加指定的className
 * @param el
 * @param name
 */
export function addClass(el, name) {
  if (!el || typeof el !== 'object' || !name) return false;
  let classList = el.className.split(/\s+/);
  if (!classList.find(t => t && t === name)) classList.push(name);
  el.className = classList.join(' ');
}

/**
 * 删除指定el的className
 * @param el
 * @param name
 */
export function removeClass(el, name) {
  if (!el || typeof el !== 'object' || !name) return false;
  let classList = el.className !== '' ? el.className.split(/\s+/) : [];
  classList = classList.filter(t => t && t !== name);
  el.className = classList.join(' ');
}


/**
 * 判断传入的值是否包含UUID/guid
 */
export function hasUUID(str) {
  if (!str || typeof str !== 'string') return false;
  return /[0-9a-zA-Z]{8}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{12}/.test(str)
}

/**
 * 判断传入的值是否是UUID/guid
 */
export function isUUID(id) {
  return /^[0-9a-zA-Z]{8}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{12}$/.test(id)
}

// 生成GUID
export function uuid() {
  return `${S4()}${S4()}-${S4()}-${S4()}-${S4()}-${S4()}${S4()}${S4()}`;
}

/**
 * @return {string}
 */
function S4() {
  return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
}

// file文件读取, 封装FileReader
export function reader(file, options) {
  options = options || {};
  return new Promise((resolve, reject) => {
    let reader = new FileReader();
    reader.onload = (e) => {
      const data = e.target.result;
      let wb = Xlsx.read(data, {type: 'binary', cellDates: true});
      let result = [];
      wb.SheetNames.forEach((name) => {
        result.push({sheetName: name, sheet: Xlsx.utils.sheet_to_json(wb.Sheets[name], {header: 1})});
      });
      resolve(result);
    };
    reader.onerror = reject;

    if (options.accept && !new RegExp(options.accept).test(file.type)) {
      // eslint-disable-next-line prefer-promise-reject-errors
      reject({code: 1, msg: 'wrong file type!'});
    }

    if (file && file.type) {
      reader.readAsBinaryString(file);
    } else {
      reader.readAsDataURL(file);
    }
  });
}

/**
 * @param {*Number} type 打印类型 0-预览/打印，1-打印
 * @param {*String} innerHtml 打印的内容
 * @param {*Object} page 打印的参数设置
 * @param {*Number} pageType 1-打印html内容 2（非1）-只能打印table类型的html
 * @returns Promise
 */
export function printLodop(type, innerHtml, page, pageType) {
  try {
    if (!innerHtml) return Promise.reject({msg: new Error('没有要导出的数据!')});
    let LODOP = getLodop();
    if (!LODOP) return Promise.reject({msg: new Error('没有安装打印插件, 请刷新或联系管理员!!')});
    console.log(innerHtml);
    let arr = innerHtml.replace(/(^\s*)|(\s*$)/g, '').split(`<div class="cutpage"></div>`);
    for (let i = 0; i < arr.length; i++) {
      if (arr[i] !== '') {
        LODOP.SET_PRINT_PAGESIZE(page.pageDirection, page.pageWidth + 'mm', page.pageHeight + 'mm', 'printPaper');
        if (pageType === 1) {
          LODOP.ADD_PRINT_HTM(page.pageMarginTop + 'mm', page.pageMarginleft + 'mm', page.pageContentHeight + '%', page.pageContentWidth + '%', arr[i]);
        } else {
          LODOP.ADD_PRINT_TABLE(page.pageMarginTop + 'mm', page.pageMarginleft + 'mm', page.pageContentHeight + '%', page.pageContentWidth + '%', arr[i]);
          LODOP.SET_PRINT_STYLEA(0, 'TableHeightScope', 1);
        }
        let qrcodeStart = arr[i].indexOf('<h5>'), qrcodeEnd = arr[i].indexOf('</h5>'), qrcode = '';
        if (qrcodeStart !== -1 && qrcodeEnd !== -1) qrcode = arr[i].substring(qrcodeStart + 4, qrcodeEnd);
        if (qrcode !== '') LODOP.ADD_PRINT_BARCODE(1, 670, 80, 80, 'QRCode', qrcode);
        LODOP.NewPageA();
      }
    }
    if (type === 0) {
      LODOP.SET_PRINT_MODE('AUTO_CLOSE_PREWINDOW', 1);
      LODOP.PREVIEW();
    } else {
      /*
      if (LODOP.CVERSION) {
        let lodop = LODOP;
        LODOP.On_Return = (TaskID, Value) => {
          if (Value >= 0) {
            lodop.PRINT();
          }
        };
        LODOP.SELECT_PRINTER();
        return;
      }
      LODOP.PRINT();
      LODOP.PREVIEW();
      */
      LODOP.PRINTA();
    }
    return new Promise((resolve, reject) => {
      LODOP.On_Return = function (TaskID, Value) {
        if (Value === '1' || Value === true) {
          console.log('已发出实际打印命令！');
          resolve({Value, msg: '已发出实际打印命令！'});
        } else {
          console.log('放弃打印！');
          reject({Value, msg: '放弃打印'});
        }
      }
    })

  } catch(e) {
    console.error(e);
    return Promise.reject({msg: new Error('打印错误'), e});
  }
}

/**
 * 通过打印lodop组件的导出功能导出exls文件
 * @param tempStr string 导出的数据的字符串html
 * @param pages string 页面设置
 * @param sheetName 表格信息
 * @return {Promise<unknown>|boolean|ElMessageComponent}  返回是否导出成功
 */
export function saveLodopFileXls(tempStr, pages, sheetName) {
  if (!tempStr) return Message.warning('没有要导出的数据!');
  const LODOP = getLodop();
  if (!LODOP) return false;

  try {
    LODOP.ADD_PRINT_TABLE(`${pages.upMargin}mm`, `${pages.leftMargin}mm`, `${pages.widthRatio}%`, `${pages.heightRatio}%`, tempStr);
    LODOP.SET_SAVE_MODE('Orientation', pages.paperDirection);
    LODOP.SET_SAVE_MODE("CenterVertically", true); //Excel文件的页面设置：页面垂直居中
    // LODOP.SET_SAVE_MODE("QUICK_SAVE",true);//快速生成（无表格样式,数据量较大时或许用到）
    LODOP.SAVE_TO_FILE(sheetName);
  } catch (e) {
    console.log('打印报错');
    return Promise.resolve(e)
  }
  return new Promise((resolve, reject) => {
    LODOP.On_Return = function (TaskID, Value) {
      if (Value === '1') {
        console.log("已经发起导出功能！");
        resolve({TaskID, Value});
      } else {
        console.log("放弃导出！");
        reject({TaskID, Value});
      }
    }
  });
}

/**
 * 函数 rmh by 2022-08-11
 * 防抖: 对于短时间内连续触发的事件（滚动事件、表单重复提交、页面resize事件，常见于需要做页面适配的时候），让某个时间期限内，事件处理函数只执行一次。
 * 节流：对于短时间内大量触发同一事件（滚动事件、输入框实时搜索），那么在函数执行一次之后，该函数在指定的时间期限内不再工作，直至过了这段时间才重新生效
 * **/
// 防抖
export function debounce(fn, delay) {
  delay = delay || 200;
  let timer = null;
  return function () {
    let th = this, args = arguments;
    // 判断还在定时，说明当前正在一个计时过程中，并且又触发了相同事件。所以要取消当前的计时，重新开始计时
    if (timer) clearTimeout(timer);
    timer = setTimeout(() => {
      timer = null;
      fn.apply(th, args);
    }, delay);
  }
}

// 节流 定时器 + 时间戳
export function throttle(func, delay) {
  let timer = null, startTime = Date.now();
  return function () {
    // 结束时间
    let curTime = Date.now();
    // 间隔时间 = 延迟的时间 - （结束时间戳 - 开始时间戳）
    let interval = delay - (curTime - startTime);
    let th = this, args = arguments;
    clearTimeout(timer);
    if (interval <= 0) {
      // 证明可以触发了
      func.apply(th, args);
      // 重新计算开始时间
      startTime = Date.now()
    } else {
      // 继续等待
      timer = setTimeout(func, interval)
    }
  }
}

export function format(val, temp) {
  if (!val) return val;
  temp = temp ? temp : 'YYYY-MM-DD';
  return moment(new Date(val)).format(temp)
}
